//
//  UserAccountViewModel.swift
//  weibo10
//
//  Created by 周荣硕 on 16/1/11.
//  Copyright © 2016年 grgbanking. All rights reserved.
//

import Foundation

 /// 用户视图模型

class UserAccountViewModel{
    
    /// 单例 -- 解决避免重复从沙盒 加载 归档 文件，提高 效率 ，让access_token  便于被访问到
    static let sharedUserAccount = UserAccountViewModel()
    /// 用户模型
    var account: UserAccount?
    /// 用来登录标记
    var userLogon: Bool{
    
        //1.如果token有值,说明登录成功
        //2.如果没有过期，说明登录有效
        
        return account?.access_token != nil && !isExpired
    }
    
    //返回有效的token
    
    var accessToken:String?{
    
        if !isExpired{
            
            return account?.access_token
        }
        
        return nil
    }
    
    ///  归档保存的路径 -计算型属性 类似有返回值的函数

    private var accountPath: String{
    
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!

        return (path as NSString).stringByAppendingPathComponent("account.plist")
    }
    
    /// 判断账户是否过期
    //判断用户账户过期日期与当前系统日期 ‘进行比较’
    
    
    private var isExpired: Bool{
    
        if account?.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending{
        
            return false
        }
        
        return true
        
        
    }
    ///  构造函数 --私有化会要求外部只能通过单例常量访问,而不能（）实例化
    private init(){
    
        // 从沙盒解档数据，恢复当前数据 - 磁盘读写的速度最慢，不如内存读写效率高！

        account = NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath) as? UserAccount
        
        ///  判断token是否过期
        if isExpired{
        
            print("已经过期")
            //如果过期，清空解档的数据
            
            account = nil
            
        }
        
//        print(account)
    }
    
    
    
}

// MARK: - 用户账户相关的网络方法
extension UserAccountViewModel{

    func loadAccessToken(code:String, finished:(isSuccessed:Bool)->()){
        
        NetworkTools.sharedTools.loadAccessToken(code) { (result, error) -> () in
            
            if error != nil{
                print("出错了")
                //失败的回调
                finished(isSuccessed:  false)
                
                return
            }
            
            //输出结果
            
            print(result)
            
            self.account = UserAccount(dict: result as![String:AnyObject])
            //            print(account)
            
            self.loadUserInfo(self.account!,finished: finished)
        }
        
    }
    ///  加载用户信息
    ///
    ///  - parameter account:  授权码
    ///  - parameter finished: 完成回调
    
    private func loadUserInfo(account:UserAccount,finished:(isSuccessed:Bool)->()){
    
//            NetworkTools.sharedTools.loadUserInfo(account.uid!, accessToken: account.access_token！) { (result, error) -> () in
    
        NetworkTools.sharedTools.loadAccessToken(account.uid!) { (result, error) -> () in
            
        
                if error != nil{
    
                    print("加载用户出错了")
                    
                    finished(isSuccessed: false)
                    return
    
                }
    
                guard let dict = result as? [String:AnyObject] else{
    
                    print("格式错误")
                    finished(isSuccessed: false)
                    return
                }
    
    //            print(result)
    
                account.avatar_large = (dict["avatar_large"]) as? String
                account.screen_name = (dict["screen_name"]) as? String
    
    
                //保存对象 --会调用对象的encoderWithCoder 方法
                
                NSKeyedArchiver.archiveRootObject(account, toFile: self.accountPath)

//                account.saveUserAccount()
                
                print(self.accountPath)
                //需要完成回调！！！
                finished(isSuccessed: true)
                
            }
        }

}